/**
 * 
 */
package pittypat;

import java.io.IOException;
import java.io.Writer;

/**
 * 表示用户登录的结果，由 IAuthorityService.login 方法使用作为返回结果。
 * <p>
 * 登录结果返回用户令牌和用户信息，登录成功后用户属性不能为 null，否则被视为登录失败。如果设置了用户的
 * LoginHomeUrl，则跳转到目标路径，否则停留在当前页面。
 */
public final class LoginResult extends Model {
	/**
	 * 表示匿名用户登录结果。这是一个只读字段。
	 */
	public static final LoginResult ANONYMOUS = new LoginResult(User.ANONYMOUS, "");

	private IUser user;
	private String token;

	/**
	 * 使用登录用户的用户信息和用户令牌初始化 LoginResult 的新实例。
	 * 
	 * @param user
	 *            用户信息。
	 * @param token
	 *            用户令牌。
	 */
	public LoginResult(IUser user, String token) {
		this.user = user == null ? User.ANONYMOUS : user;
		this.token = token == null ? "" : token;
	}

	/**
	 * 获取一个值，该值指示当前登录的结果是否代表了匿名用户。
	 * 
	 * @return 如果 User 为 null，或者 User.Id 没有值，或者 Token 为 null 或空字符串，则返回 true，否则返回
	 *         false。
	 */
	public boolean isAnonymous() {
		return this.user == null || this.user.getId() == null || this.token == null || this.token.length() == 0;
	}

	/**
	 * 获取登录用户的用户信息，其中包含 LoginHomeUrl。
	 * 
	 * @return 用户信息。
	 */
	public IUser getUser() {
		return this.user;
	}

	/**
	 * 获取登录用户的用户令牌。
	 * 
	 * @return 用户令牌。
	 */
	public String getToken() {
		return this.token;
	}

	/**
	 * 设置用户令牌。用于拆分用户令牌时将令牌重置为完整令牌的一部分。
	 * 
	 * @param token
	 */
	public void setToken(String token) {
		this.token = token == null ? "" : token;
	}

	/**
	 * 将当前对象作为 JSON 字符串写入指定的文本流。
	 * 
	 * @param writer
	 *            目标文本流。
	 * @throws IOException
	 * @see pittypat.IJson#write(java.io.Writer)
	 */
	@Override
	public void write(Writer writer) throws IOException {
		if (writer == null) {
			throw new IllegalArgumentException("writer 为 null。");
		}

		writer.write("{\"user\":");
		if (this.user == null) {
			writer.write("null");
		} else {
			this.user.write(writer);
		}

		writer.write(",\"token\":\"" + Json.escape(this.token) + "\"}");
	}
}
